package sort;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
 * @author dx
 * @version 1.0
 * @date 2022/3/24 13:59
 * @description:
 * 给两个整数数组nums1和nums2，返回两个数组的交集，返回结果中每个元素出现的此时，应与元素在两个数组中都出现
 * 的次数一致
 * getOrDefault() 方法的语法为：hashmap.getOrDefault(Object key, V defaultValue)
 * key - 键
 * defaultValue - 当指定的key并不存在映射关系中，则返回的该默认值
 *
 * Arrays.copyOfRange(T[]original,int form,int to):讲一个原始数组original，从下标form开始复制，复制到上标to，生成一个新的数组。左闭右开 [a,b)
 */
public class Jioaji2 {



    public static void main(String[] args){

        int test1[] = {1,2,2,2,3,3,4,5};
        int test2[] = {1,2,2,3,4,4};
        int result[] = new int[7];
       result = intersect(test1,test2);
       for(int i=0;i<result.length;i++)
           System.out.println(result[i]);
    }

    public static int[] intersect(int[] nums1,int[] nums2) {
        //有问题未解决
//        if (nums1.length > nums2.length){
//            return intersect(nums2, nums1);
//        }

        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        //记录较短元素数组中每个元素的出现次数
        for (int num : nums1) {
            if (!map.containsKey(num)) {
                map.put(num, 1);
            } else {
                map.put(num, map.get(num) + 1);
            }

        }
        int index = 0;
        int result[] = new int[nums1.length];
        for (int num : nums2) {
            int count = map.getOrDefault(num, 0);
            if (count > 0) {
                result[index++] = num;

                count--;
                if (count > 0) {
                    map.put(num, count);
                } else {
                    map.remove(num, count);
                }
            }

        }
        return Arrays.copyOfRange(result, 0, index);
    }

    }

